package com.googlecode.sparda.commons.lang;

import java.util.ArrayList;

/**
 * Utility per le stringhe.
 * @author Fabio Grucci (<i>alias</i> <b>Phoenix</b>)
 * @since 1.0
 * @version 1.0
 */
public class StringUtils {
	
	private StringUtils() {/* Utility class */}
	
	/**
	 * Dimensione del carattere di tab.
	 */
	public static final int TAB_SIZE = 8;

	/**
	 * Metodo che consente di far ritornare una stringa da una matrice di stringhe rappresentante la
	 * forma "tabellare della matrice".
	 * @param strings Le stringhe dalle quali comporre la matrice
	 * @return La stringa sotto forma tabellare
	 */
	public static String toTableString(final String[][] strings) {
		ArrayList<Integer> massimiColonne = new ArrayList<Integer>(strings[0].length);
		int totalStringLength = 0;
		int lunghezza;
		/* Inizializzo la testa dei valori massimi */
		for(int j=0; j<strings[0].length; j++) {
			lunghezza = strings[0][j].length();
			totalStringLength += lunghezza;
			massimiColonne.add(j, lunghezza);
		}
		/* Per ogni riga cerco */
		for(int i=1; i<strings.length; i++)
			/* E per tutte le colonne della riga */
			for(int j=0; j<strings[i].length; j++) {
				lunghezza = strings[i][j].length();
				totalStringLength += lunghezza;
				try {
					if( lunghezza > massimiColonne.get(j)) {
						massimiColonne.set(j, lunghezza);
						totalStringLength++;
					}
				} catch (IndexOutOfBoundsException e) {
					massimiColonne.add(lunghezza);
					totalStringLength += strings.length - i;
				}
				totalStringLength++;
			}
		return componi(massimiColonne, strings, totalStringLength);
	}

	/**
	 * Metodo che consente di far ritornare una stringa da una matrice di stringhe rappresentante la
	 * forma "tabellare della matrice".
	 * @param massimiColonne Il massimo numero di caratteri delle colonne della matrice
	 * @param stringhe Le stringhe dalle quali comporre la matrice
	 * @return La stringa sotto forma tabellare
	 */
	public static String componi(ArrayList<Integer> massimiColonne, String[][] stringhe) {
		return componi(massimiColonne, stringhe, massimiColonne.size() * stringhe.length);
	}

	/**
	 * Metodo che consente di far ritornare una stringa da una matrice di stringhe rappresentante la
	 * forma "tabellare della matrice".
	 * @param massimiColonne Il massimo numero di caratteri delle colonne della matrice
	 * @param stringhe Le stringhe dalle quali comporre la matrice
	 * @param totalLengthString La lunghezza totale approssimativa della stringa risultato
	 * @return La stringa sotto forma tabellare
	 */
	public static String componi(ArrayList<Integer> massimiColonne, String[][] stringhe, int totalLengthString) {
		StringBuffer risultato = new StringBuffer(totalLengthString);
		for (int i = 0; i < stringhe.length; i++) {
			for (int j = 0; j < stringhe[i].length; j++) {
				String toAdd = stringhe[i][j];
				risultato.append(toAdd);
				for(int tab = (massimiColonne.get(j)/TAB_SIZE) - (toAdd.length()/TAB_SIZE) + 1; tab>=0; tab--)
					risultato.append("\t");
			}
			risultato.append("\n");
		}
		return risultato.toString();
	}
	
	public static void main(String[] args) {
//		String s1 = "abcdefg ? hij ?klmnopqrst??uvwx?yz";
//		String toIns[] = new String[] {"gino","pino","gennaro","basta", "", "Mah"};
//		String s2 = "def";
//		char c = 'l';
//		char array[] = new char[] {'a','b','C','m','d','E','Z','F'};
//		System.out.println(remove(c,s1));
//		System.out.println(remove(s2,s1));
//		System.out.println(removeToLast(c,s1));
//		System.out.println(removeToLast(s2,s1));
//		System.out.println(removeAll(array,s1));
//		System.out.println(removeAllIgnoreCase(array,s1));
//		System.out.println(replace(1,s1,c));
//		System.out.println(replaceAll(s1,toIns));
		
	}
}
